/**
 * WanlShop状态管理器 - 购物车
 * 
 * @ author 深圳前海万联科技有限公司 <wanlshop@i36k.com> 
 * < 程序仅用作FastAdmin付费插件API测试使用，未经版权所有权人书面许可，不能用于商业用途！>
 * < 购物车状态管理器，不得复制、二次开发到第三方项目，否则我们会追究其法律责任 >
 * @ link http://www.wanlshop.com
 * @ 2020年9月29日19:00:46
 * @ version 1.0.0
 **/
import Vue from 'vue';
import api from '../../common/request/request';
import fun from '../../common/wanlshop_function';
export default {
	namespaced: true,
	state: {
		list: [], // 购物车数据
		cartnum: 0, // 商品数量
		allchoose: 0, //店铺选中个数
		allsum: 0, //总计金钱价格
		allHaoRen: 0, // 总计好人值价格
		allnum: 0, //总计数量
		status: false, //全选选中状态
		operate: false //管理购物车状态
	},
	actions: {
		async operate({
			state
		}) {
			state.operate = !state.operate;
		},
		async get({
			state,
			dispatch,
			rootState
		}) {
			setTimeout(() => {
				// 初始化购物车复用同步购物车
				if (rootState.user.isLogin) {
					// 如果登录则同步
					dispatch('login');
				} else {
					// 否则 初始化客户端，购物车用本地赋值，后续格式化购物车数据，整理
					uni.getStorageSync("wanlshop:cart") ? dispatch('format', uni.getStorageSync(
						"wanlshop:cart")) : '';
				}
			}, 1000);
		},
		async login({
			state,
			dispatch
		}) {
			let cart = uni.getStorageSync("wanlshop:cart");
			// 强制合并
			api.post({
				url: '/wanlshop/cart/synchro',
				data: {
					cart: cart ? cart : null
				},
				success: res => {
					dispatch('format', res);
				}
			});
		},
		// 操作商品 1.0.2升级 ---------------------------------------------------------------------------
		async choose({
			state,
			dispatch
		}, {
			index,
			keys
		}) {
			let cart = state.list[index];
			let goods = cart.products[keys];
			!goods.checked ? dispatch('choosetrue', {
				cart: cart,
				goods: goods
			}) : dispatch('choosefalse', {
				cart: cart,
				goods: goods
			});
		},
		async choosetrue({
			state
		}, {
			cart,
			goods
		}) {
			//将商品选中状态改为true
			goods.checked = true;
			// 选中商品数量先+1	
			cart.choose++;
			// 再与该店铺商品数量比较，如果相等就更改店铺选中状态为true
			if (cart.choose === cart.products.length) {
				cart.check = true;
			}
			//如果店铺选中状态改为true
			if (cart.check) {
				// 选中店铺，数量先+1
				state.allchoose++;
				// 再与店铺数量比较，如果相等就更改全选选中状态为true
				if (state.allchoose === state.list.length) {
					state.status = true;
				} else {
					state.status = false;
				}
			}
			state.allsum = fun.bcadd(state.allsum, goods.sum);
			state.allHaoRen = fun.bcadd(state.allHaoRen, fun.bcmul(goods.number, goods.sku.haoren_number));

			state.allnum += goods.number;
		},
		async choosefalse({
			state
		}, {
			cart,
			goods
		}) {
			// 将商品选中状态改为false
			goods.checked = false;
			// 选中商品数量-1
			cart.choose--;
			//如果店铺是被选中的，更改店铺选中状态
			if (cart.check) {
				cart.check = false;
				//并且选中店铺数量-1
				state.allchoose--;
			}
			state.status = false; //无论之前全选的状态，将其改为false就行
			state.allsum = fun.bcsub(state.allsum, goods.sum); //商品总计价格变动
			state.allHaoRen = fun.bcsub(state.allHaoRen, fun.bcmul(goods.number, goods.sku.haoren_number));
			state.allnum -= goods.number;
		},
		// 操作店铺
		async shopchoose({
			dispatch
		}, cart) {
			!cart.check ? dispatch('shoptrue', cart) : dispatch('shopfalse', cart);
		},
		async shoptrue({
			dispatch
		}, cart) {
			//循环店铺中的商品，先筛选出目前没选中的商品，给它执行choosetrue
			cart.products.forEach((goods) => {
				goods.checked === false && dispatch('choosetrue', {
					cart: cart,
					goods: goods
				});
			})
		},
		async shopfalse({
			dispatch
		}, cart) {
			//循环店铺中的商品，先筛选出目前被选中的商品，给它执行choosefalse
			cart.products.forEach((goods) => {
				goods.checked === true && dispatch('choosefalse', {
					cart: cart,
					goods: goods
				});
			})
		},
		// 全选
		async cartchoose({
			state,
			dispatch
		}) {
			state.status = !state.status //取反改变状态
			//根据取反后的状态进行相应的店铺按钮操作   
			state.status ? state.list.forEach((cart) => dispatch('shoptrue', cart)) : state.list.forEach((cart) =>
				dispatch('shopfalse', cart));
		},
		// 结算
		async settlement({
			state,
			dispatch,
			rootState
		}) {
			let data = [];
			let checkedShopNum = 0
			state.list.forEach((cart, index) => {
				cart.products.forEach((goods, key) => {
					if (goods.checked) {
						checkedShopNum++
						data.push({
							shop_id: cart.shop_id,
							goods_id: goods.goods_id,
							number: goods.number,
							sku_id: goods.sku.id,
							haoren_number: goods.sku.haoren_number,
							sum: goods.sum
						});
					}
				});
			});
			let copyData = JSON.parse(JSON.stringify(data))
			let isMoreShop = copyData.reduce((pre, cur)=> {
				if(pre.shop_id === cur.shop_id){
					// pre.shop_id = cur.shop_id 
				}else{
					return true
				}
				return false
			}, copyData[0])
			if(isMoreShop){
				uni.showModal({
					title:'警告',
					content: '只能选择一家店铺进行支付',
					confirmText: '确定',
					showCancel:false
				})
				return
			}
			// 判断商品支付类型
			let isHaoren = 0; //0好人值+金额  1金额  2好人值
			isHaoren = data.every(item => {
				return Number(item.sum) != 0 && Number(item.haoren_number) == 0
			}) ? 1 : data.every(item => {
				return Number(item.sum) == 0 && Number(item.haoren_number) != 0
			}) ? 2 : 0

			// 判断是否登录
			rootState.user.isLogin ? uni.navigateTo({
				url: `/pages/shop/order/addorder?type=cart&data=${JSON.stringify(data)}&isHaoren=${isHaoren}`
			}) : uni.navigateTo({
				url: `/pages/user/auth/auth`
			});
		},
		// 整理本地数据、云端同步数据-------------------------------------------需要同步----------
		async format({
			state,
			dispatch
		}, data) {
			let map = {},
				dest = [];
			for (let i = 0; i < data.length; i++) {
				let cart = data[i];
				// 1.0.2升级 读取数据库暂时取消所有已选
				cart.checked = false;
				if (!map[cart.shop_id]) {
					dest.push({
						shop_id: cart.shop_id,
						shop_name: cart.shop_name,
						products: [cart],
						check: false,
						choose: 0
					});
					map[cart.shop_id] = cart;
				} else {
					for (let j = 0; j < dest.length; j++) {
						let dj = dest[j];
						if (dj.shop_id == cart.shop_id) {
							dj.products.push(cart);
							break;
						}
					}
				}
			}
			state.list = dest;
			state.cartnum = 0;
			state.allchoose = 0;
			state.allsum = 0;
			state.allHaoRen = 0;
			state.allnum = 0;
			state.status = false; // 全选选中状态
			state.operate = false; // 管理购物车状态
			dispatch('storage', {
				type: 'synchro'
			});
		},
		// 加
		async bcadd({
			state,
			dispatch
		}, goods) {
			goods.number++;
			goods.sum = fun.bcadd(goods.sum, goods.sku.price);
			if (goods.checked) {
				state.allnum++;
				state.allsum = fun.bcadd(state.allsum, goods.sku.price);
				state.allHaoRen = fun.bcadd(state.allHaoRen, goods.sku.haoren_number);
			}
			dispatch('storage', {
				type: 'bcadd',
				goods: goods
			});
		},
		// 减
		async bcsub({
			state,
			dispatch
		}, goods) {
			if (goods.number > 1) {
				goods.number--;
				goods.sum = fun.bcsub(goods.sum, goods.sku.price);
				if (goods.checked) {
					state.allnum--;
					state.allsum = fun.bcsub(state.allsum, goods.sku.price);
					state.allHaoRen = fun.bcsub(state.allHaoRen, goods.sku.haoren_number);
				}
				dispatch('storage', {
					type: 'bcsub',
					goods: goods
				});
			}
		},
		// 添加购物车---------------------------------------------------------------------------
		async add({
			state,
			dispatch
		}, goods) {
			let isshop = -1;
			let data = {
				goods_id: goods.goods_id,
				sku_id: goods.sku_id,
				title: goods.title,
				image: goods.image,
				sku: goods.sku,
				number: goods.number,
				sum: goods.sum,
				haoren_sum: goods.haoren_sum,
				checked: false
			};
			state.list.find((item, index) => {
				if (item.shop_id == goods.shop_id) {
					isshop = index;
				}
			});
			// 新店铺
			if (isshop == -1) {
				state.list.push({
					shop_id: goods.shop_id,
					shop_name: goods.shop_name,
					products: [data],
					check: false, //店铺选中状态
					choose: 0, //商品选中个数
				});
			} else {
				// 老店铺追加
				let products = state.list[isshop].products;
				let isgoods = -1;
				products.find((item, index) => {
					if (item.goods_id === goods.goods_id && item.sku_id === goods.sku_id) {
						isgoods = index;
					}
				});
				if (isgoods == -1) {
					// 有新，即不会全选，复用以上方法全取消
					dispatch('shopfalse', state.list[isshop]);
					products.push(data);
				} else {
					// 商品已存在，只添加数量
					let shop = products[isgoods];
					shop.number += goods.number;
					shop.sum = fun.bcmul(goods.sku.price, shop.number);
					// 如果店铺全选,必须取消店铺全选
					if (shop.checked) {
						state.allnum += goods.number;
						state.allsum = fun.bcadd(state.allsum, fun.bcmul(goods.sku.price, goods.number));
						state.allHaoRen = fun.bcadd(state.allHaoRen, fun.bcmul(goods.sku.haoren_number, goods
							.number));
					}
				}
			}
			dispatch('storage', {
				type: 'add',
				goods: goods
			});
		},
		// 移动入关注
		async move({
			state,
			dispatch,
			rootState
		}) {
			// 判断是否登录
			rootState.user.isLogin ? dispatch('storage', {
				type: 'follow'
			}) : uni.navigateTo({
				url: `/pages/user/auth/auth`
			});
		},
		// 删除购物车
		async del({
			state,
			dispatch
		}) {
			// 判断是否全选如果全选直接清空
			if (state.status) {
				dispatch('empty');
			} else {
				dispatch('storage', {
					type: 'del'
				});
			}
		},
		// 清空购物车
		async empty({
			state,
			dispatch
		}) {
			state.list = [];
			state.cartnum = 0;
			state.allchoose = 0;
			state.allsum = 0;
			state.allHaoRen = 0;
			state.allnum = 0;
			state.status = false; // 全选选中状态
			state.operate = false; // 管理购物车状态
			dispatch('storage', {
				type: 'empty'
			});
		},
		// 数据操作 1.0.2升级
		async storage({
			state,
			dispatch,
			rootState
		}, {
			type,
			goods
		}) {
			let cloud = null; // 云端更新条件
			let storage = []; // 本地更新条件
			// 删除，移动关注需要用到
			let select = []; // 选中数据
			let unchecked = []; // 未选中数据
			// 操作数据
			if (type == 'empty') {
				cloud = {
					type: type
				};
			} else {
				// 遍历
				state.list.forEach((cart, index) => {
					cart.products.forEach((item, key) => {
						let data = {
							shop_id: cart.shop_id,
							shop_name: cart.shop_name,
							goods_id: item.goods_id,
							title: item.title,
							number: item.number,
							image: item.image,
							sku: item.sku,
							sku_id: item.sku_id,
							sum: item.sum,
							checked: item.checked
						};
						if (type == 'del' || type == 'follow') {
							if (item.checked) {
								select.push(data);
							} else {
								unchecked.push(data);
							}
						} else {
							storage.push(data);
						}
					});
				});
				// 统计数量
				state.cartnum = storage.length;
				// 整理数据
				if (type == 'bcsub' || type == 'bcadd') {
					cloud = {
						type: type,
						goods_id: goods.goods_id,
						sku_id: goods.sku_id,
						number: goods.number,
						sum: goods.sum
					};
				} else if (type == 'del' || type == 'follow') {
					dispatch('format', unchecked);
					storage = unchecked;
					cloud = {
						type: type,
						data: select
					};
					// 取消管理
					state.operate = false;
				} else if (type == 'add') {
					cloud = {
						type: type,
						data: goods
					};
					// 取消全选
					state.status = false;
				}
			}
			// 操作云端
			if (cloud != null && rootState.user.isLogin) {
				api.post({
					url: '/wanlshop/cart/storage',
					data: cloud,
					success: res => {
						if (type == 'follow') {
							rootState.statistics.dynamic.collection = rootState.statistics.dynamic
								.collection + res;
						}
					}
				});
			}
			// 保存本地
			uni.setStorageSync("wanlshop:cart", storage);
		}
	}
};
